﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;


typedef char DataType;
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		cout << "Stack()" << endl;

		_array = new DataType[capacity];
		//_array = new char[0x7fffffff];

		_capacity = capacity;
		_size = 0;
	}

		void Push(DataType data)
		{
			// CheckCapacity();
			_array[_size] = data;
			_size++;
		}
	
		~Stack()
		{
			cout << "~Stack()" << endl;
	
			delete[] _array;
			_array = nullptr;
			_size = _capacity = 0;
		}
	private:
		// 内置类型
		DataType* _array;
		int _capacity;
		int _size;
	};

 Stack * func()
{
	int n;
	cin >> n;
	Stack* pst = new Stack(n);

	return pst;
}
//
// int main()
//{
//	Stack* ptr = func();
//	ptr->Push(1);
//	ptr->Push(2);
//	// ....
//
//	delete ptr;
//
//	return 0;
//}


 //class A
 //{
 //public:
	// A(int a = 0)
	//	 : _a(a)
	// {
	//	 cout << "A():" << this << endl;
	// }

	// ~A()
	// {
	//	 cout << "~A():" << this << endl;
	// }
 //private:
	// int _a;
 //};


 //int main()
 //{
	// //A* p1 = (A*)malloc(sizeof(A));
	// //A* p2 = new A(1);
	// //free(p1);
	// //delete p2;


	// int* p3 = (int*)malloc(sizeof(int)); // C
	// int* p4 = new int;
	// free(p3);
	// delete p4;


	// A* p5 = (A*)malloc(sizeof(A) * 10);
	// A* p6 = new A[10];
	// free(p5);
	// delete[] p6;
	// return 0;
 //}

////void func()
////{
////	stack st;
////	char* p1 = new char[0x7fffffff];
////
////	char* p1 = new char[1000000000];
////	cout << (void*)p1 << endl;
////
////	cout << "hello world" << endl;
////}

//int main()
//{
//	try
//	{
//		func();
//	}
//	catch (const exception& e)
//	{
//		cout << e.what() << endl;
//	}
//
//	return 0;
//}


 //class A
 //{
 //public:
	// A(int a = 0)
	//	 : _a(a)
	// {
	//	 cout << "A():" << this << endl;
	// }
	// ~A()
	// {
	//	 cout << "~A():" << this << endl;
	// }
 //private:
	// int _a;
 //};

 //int main()
 //{
	//
	// A* p1 = (A*)malloc(sizeof(A));
	// new(p1)A;// 注意：如果A类的构造函数有参数时，此处需要传参
	// p1->~A();
	// free(p1);


	// A* p2 = (A*)operator new(sizeof(A));
	// new(p2)A(10);
	// p2->~A();
	// operator delete(p2);
	// return 0;
 //}


//int main()
//{
//	Stack* pst1 = (Stack*)operator new(sizeof(Stack));
//	operator delete(pst1);
//
//
//	Stack* pst2 = new Stack;
//	//delete pst2;
//	//free(pst2);
//
//	//int* p1 = new int[10];
//	//free(p1);
//	//delete p1;
//	//delete[] p1;
//
//	A* p2 = new A[10];
//	//free(p2);
//	delete p2;
//	//delete (p2-1);
//	//delete[] p2;
//
//	return 0;
//}


//template<typename T>
//
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}


//class A
//{
//public:
//	A(int a = 0)
//		: _a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//
// int main()
// {
//	 ﻿A *pa = new A[10];
//
//	 delete[]pa;
// }